<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
          PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
   <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
   <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 22." />
   <meta name="GENERATOR" content="vi and eight fingers" />
   <title>libstdc++-v3 HOWTO:  Chapter 22: Localization</title>
<link rel="StyleSheet" href="../lib3styles.css" type="text/css" />
<link rel="Start" href="../documentation.html" type="text/html"
  title="GNU C++ Standard Library" />
<link rel="Prev" href="../21_strings/howto.html" type="text/html"
  title="Strings" />
<link rel="Next" href="../23_containers/howto.html" type="text/html"
  title="Containers" />
<link rel="Bookmark" href="locale.html" type="text/html" title="class locale" />
<link rel="Bookmark" href="codecvt.html" type="text/html" title="class codecvt" />
<link rel="Bookmark" href="ctype.html" type="text/html" title="class ctype" />
<link rel="Bookmark" href="messages.html" type="text/html" title="class messages" />
<link rel="Bookmark" href="http://www.research.att.com/~bs/3rd_loc0.html" type="text/html" title="Bjarne Stroustrup on Locales" />
<link rel="Bookmark" href="http://www.cantrip.org/locale.html" type="text/html" title="Nathan Myers on Locales" />
<link rel="Copyright" href="../17_intro/license.html" type="text/html" />
<link rel="Help" href="../faq/index.html" type="text/html" title="F.A.Q." />
</head>
<body>

<h1 class="centered"><a name="top">Chapter 22:  Localization</a></h1>

<p>Chapter 22 deals with the C++ localization facilities.
</p>
<!-- I wanted to write that sentence in something requiring an exotic font,
     like Cyrllic or Kanji.  Probably more work than such cuteness is worth,
     but I still think it'd be funny.
 -->


<!-- ####################################################### -->
<hr />
<h1>Contents</h1>
<ul>
   <li><a href="#1">class locale</a></li>
   <li><a href="#2">class codecvt</a></li>
   <li><a href="#3">class ctype</a></li>
   <li><a href="#4">class messages</a></li>
   <li><a href="#5">Bjarne Stroustrup on Locales</a></li>
   <li><a href="#6">Nathan Myers on Locales</a></li>
   <li><a href="#7">Correct Transformations</a></li>
</ul>

<!-- ####################################################### -->

<hr />
<h2><a name="1">class locale</a></h2>
   <p>Notes made during the implementation of locales can be found 
      <a href="locale.html">here</a>.
   </p>

<hr />
<h2><a name="2">class codecvt</a></h2>
   <p>Notes made during the implementation of codecvt can be found 
      <a href="codecvt.html">here</a>.
   </p>

   <p>The following is the abstract from the implementation notes:
   </p>
   <blockquote>
   The standard class codecvt attempts to address conversions between
   different character encoding schemes. In particular, the standard
   attempts to detail conversions between the implementation-defined
   wide characters (hereafter referred to as wchar_t) and the standard
   type char that is so beloved in classic &quot;C&quot; (which can
   now be referred to as narrow characters.)  This document attempts
   to describe how the GNU libstdc++-v3 implementation deals with the
   conversion between wide and narrow characters, and also presents a
   framework for dealing with the huge number of other encodings that
   iconv can convert, including Unicode and UTF8. Design issues and
   requirements are addressed, and examples of correct usage for both
   the required specializations for wide and narrow characters and the
   implementation-provided extended functionality are given.
   </blockquote>

<hr />
<h2><a name="3">class ctype</a></h2>
   <p>Notes made during the implementation of ctype can be found 
      <a href="ctype.html">here</a>.
   </p>

<hr />
<h2><a name="4">class messages</a></h2>
   <p>Notes made during the implementation of messages can be found 
      <a href="messages.html">here</a>.
   </p>

<hr />
<h2><a name="5">Bjarne Stroustrup on Locales</a></h2>
   <p>Dr. Bjarne Stroustrup has released a
      <a href="http://www.research.att.com/~bs/3rd_loc0.html">pointer</a>
      to Appendix D of his book,
      <a href="http://www.research.att.com/~bs/3rd.html">The C++
      Programming Language (3rd Edition)</a>.  It is a detailed
      description of locales and how to use them.
   </p>
   <p>He also writes:
   </p>
      <blockquote><em>
      Please note that I still consider this detailed description of
      locales beyond the needs of most C++ programmers.  It is written
      with experienced programmers in mind and novices will do best to
      avoid it.
      </em></blockquote>

<hr />
<h2><a name="6">Nathan Myers on Locales</a></h2>
   <p>An article entitled &quot;The Standard C++ Locale&quot; was
      published in Dr. Dobb's Journal and can be found
      <a href="http://www.cantrip.org/locale.html">here</a>.
   </p>

<hr />
<h2><a name="7">Correct Transformations</a></h2>
   <!-- Jumping directly to here from chapter 21. -->
   <p>A very common question on newsgroups and mailing lists is, &quot;How
      do I do &lt;foo&gt; to a character string?&quot; where &lt;foo&gt; is
      a task such as changing all the letters to uppercase, to lowercase,
      testing for digits, etc.  A skilled and conscientious programmer
      will follow the question with another, &quot;And how do I make the
      code portable?&quot;
   </p>
   <p>(Poor innocent programmer, you have no idea the depths of trouble
      you are getting yourself into.  'Twould be best for your sanity if
      you dropped the whole idea and took up basket weaving instead.  No?
      Fine, you asked for it...)
   </p>
   <p>The task of changing the case of a letter or classifying a character
      as numeric, graphical, etc., all depends on the cultural context of the
      program at runtime.  So, first you must take the portability question
      into account.  Once you have localized the program to a particular
      natural language, only then can you perform the specific task.
      Unfortunately, specializing a function for a human language is not
      as simple as declaring
      <code> extern &quot;Danish&quot; int tolower (int); </code>.
   </p>
   <p>The C++ code to do all this proceeds in the same way.  First, a locale
      is created.  Then member functions of that locale are called to
      perform minor tasks.  Continuing the example from Chapter 21, we wish
      to use the following convenience functions:
   </p>
   <pre>
   namespace std {
     template &lt;class charT&gt;
       charT
       toupper (charT c, const locale&amp; loc) const;
     template &lt;class charT&gt;
       charT
       tolower (charT c, const locale&amp; loc) const;
   }</pre>
   <p>
      This function extracts the appropriate &quot;facet&quot; from the
      locale <em>loc</em> and calls the appropriate member function of that
      facet, passing <em>c</em> as its argument.  The resulting character
      is returned.
   </p>
   <p>For the C/POSIX locale, the results are the same as calling the
      classic C <code>toupper/tolower</code> function that was used in previous
      examples.  For other locales, the code should Do The Right Thing.
   </p>
   <p>Of course, these functions take a second argument, and the
      transformation algorithm's operator argument can only take a single
      parameter.  So we write simple wrapper structs to handle that.
   </p>
   <p>The next-to-final version of the code started in Chapter 21 looks like:
   </p>
      <pre>
   #include &lt;iterator&gt;    // for back_inserter
   #include &lt;locale&gt;
   #include &lt;string&gt;
   #include &lt;algorithm&gt;
   #include &lt;cctype&gt;      // old &lt;ctype.h&gt;

   struct ToUpper
   {
       ToUpper(std::locale const&amp; l) : loc(l) {;}
       char operator() (char c) const  { return std::toupper(c,loc); }
   private:
       std::locale const&amp; loc;
   };
   
   struct ToLower
   {
       ToLower(std::locale const&amp; l) : loc(l) {;}
       char operator() (char c) const  { return std::tolower(c,loc); }
   private:
       std::locale const&amp; loc;
   };
   
   int main ()
   {
      std::string  s("Some Kind Of Initial Input Goes Here");
      ToUpper      up(std::locale::classic());
      ToLower      down(std::locale::classic());
   
      // Change everything into upper case.
      std::transform(s.begin(), s.end(), s.begin(), up);
   
      // Change everything into lower case.
      std::transform(s.begin(), s.end(), s.begin(), down);
   
      // Change everything back into upper case, but store the
      // result in a different string.
      std::string  capital_s;
      std::transform(s.begin(), s.end(), std::back_inserter(capital_s), up);
   }</pre>
   <p>The <code>ToUpper</code> and <code>ToLower</code> structs can be
      generalized for other character types by making <code>operator()</code>
      a member function template.
   </p>
   <p>The final version of the code uses <code>bind2nd</code> to eliminate
      the wrapper structs, but the resulting code is tricky.  I have not
      shown it here because no compilers currently available to me will
      handle it.
   </p>


<!-- ####################################################### -->

<hr />
<p class="fineprint"><em>
See <a href="../17_intro/license.html">license.html</a> for copying conditions.
Comments and suggestions are welcome, and may be sent to
<a href="mailto:libstdc++@gcc.gnu.org">the libstdc++ mailing list</a>.
</em></p>


</body>
</html>
